[따배쿠] 쿠버네티스 설치, 비설치 실습


play with K8S

ADD NEW INSTANCE 버튼을 클릭하면 아래와 같은 명령어 확인 가능

1. Initializes cluster master node:

 kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16


 2. Initialize cluster networking:

kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml


 3. (Optional) Create an nginx deployment:

 kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml
2
  • 1번의 명령어로 컴포넌트들 구성 및 마스터 노드 생성

    • 컴포넌트들의 구성요소는 API, Controller, schduler, etcd, CoreDNS 가 있다.
  • 설치 이후 워커 노드를 조인할 수 있는 키가 주어진다. (매우 중요)
  • 2번의 명령어로 네트워크를 초기화 하는 명령어이다. 네트워크를 구성한다.
  • 워커 노드를 하나 더 생성 후 아까 봤던 워커 노드를 조인할 수 있는 키를 그대로 워커노드에 복사/붙여넣기

    • 워커노드에 필요한 컴포넌트들을 구성한다.
  • kubectl get nodes -o wide 명령어로 클러스터 구성을 확인
  • 모든 쿠버네티스 설정이 완료되었다.

클라우드 서비스에서 제공하는 쿠버네티스 도구

  • 구글 쿠버네티스 엔진(GKE)
  • 아마존 쿠버네티스 일래스틱 컨테이너 서비스(EKS)
  • 애저 쿠버네티스 서비스(AKS)

쿠버네티스 클러스터를 직접 구성하는 도구

  • kubeadm

    • 쿠버네티스에서 공식 제공하는 클러스터 생성/관리 도구
  • kubespray

    • 쿠버네티스 클러스터를 배포하는 오픈소스 프로젝트
    • 다양한 형식으로 쿠버네티스 클러스터 구성가능
    • 온프레미스에서 상용 서비스 클러스터 운영시 유용
    • 다양한 CNI 제공

CNI (Container Network Interface)

  • Container간 통신을 지원하는 VxLAN, Pod Network라고도 부름
  • 다양한 종류의 플로그 인이 존재

    • 플라넬(flannel)
    • 칼리코(calico)
    • 위브넷(weavenet) 등등

쿠버네티스 클러스터 구성

  • control plane(master node)

    • 워커 노드들의 상태를 관리하고 제어
    • single master
    • multi master(3, 5개의 master nodes)
  • worker node

    • 도커 플랫폼을 통해 컨테이너를 동작하며 실제 서비스 제공

쿠버네티스 직접 설치

  1. 모든 가상머신 시작(docker 설치되어있어야 함)
  2. kubeadm 툴을 이용해 쿠버네티스 설치 쿠버네티스 공홈

    • 최소 사양 등을 확인
  3. 루트 계정 전환 & Swap disabled
$ su -
# swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
  1. Letting iptables see bridged traffic(브릿지 네트워크 Listen이 가능하도록 설정)
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
  1. Check required ports & Disable firewall
# systemctl stop firewalld
# systemctl disable firewalld
  1. Installing runtime

    • 도커 설치 완료, 동작 중
  2. Installing kubeadm, kubelet and kubectl

    • kubeadm: 쿠버네티스 전체를 관리하고 운영해주는 명령어
    • kubelet: 데몬(컨테이너 조작 및 마스터와 통신할 때 사용)
    • kubectl: 주요 명령어
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF | tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

control-plane 구성

  1. 서비스 시작 및 자동 시작 설정
systemctl start kubelet
systemctl enable kubelet
  1. control-plane 노드 실행
kubeadm init
  • 쿠버네티스의 컴포넌트들이 생성된다.

    • API, controller, scduler, etcd
  • 설치 이후 토큰 저장
cat > token.txt
  • 복사 붙여 넣기 이후 ctrl + d
  • kubectl 명령 사용허가 설정
exit

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 명령의 소유권을 루트 계정이 아닌 관리자 계정에 부여
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes 관리자 계정으로 명령어 되는지 확인

이 상태까지 따라온다면, kubectl get nodes 명령어를 입력했을 때, master 노드가 NotReady 상태로 나올텐데, CNI가 미설치 된 상태라서 그렇다. 밑의 명령어를 설치한 후 잠시 기다려보면 Ready 상태로 바뀔 수 있다.

  1. pod network add-on (CNI 설치 - weavenet)
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

kubectl get nodes로 Ready 상태를 확인

worker 노드 구성

워커 노드를 마스터 노드와 Join 시켜야한다.

  1. 아까 발급 받았던 token.txt를 각 노드에 붙여넣기 후 확인
캡처

TIP - bash창에 TAB키 이용 가능하게 하기

쿠버네티스는 기본적으로 Bash 자동완성을 지원해주고 있지않다. 쿠버네티스 공식홈페이지에서 bash completion 검색 후 kubectl 치트 시트 접속

# bash-completion 패키지를 먼저 설치한 후, bash의 자동 완성을 현재 셸에 설정한다
source <(kubectl completion bash)
# 자동 완성을 bash 셸에 영구적으로 추가한다
echo "source <(kubectl completion bash)" >> ~/.bashrc
  • kubectl를 kubeadm으로 바꾸면 kubeadm도 탭키가 가능하다.

Hello, I'm@nickhealthy
개발자를 꿈꾸고, 파이썬과 클라우드에 관심이 많은 비전공자

Github